package view;

import model.User;
import service.UserService;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;



//陈甜

// 该类表示修改密码的面板，继承自JPanel，用于构建修改用户密码的界面以及处理相关逻辑
public class ChangePasswordPanel extends JPanel {
    // 当前要修改密码的用户对象
    private User currentUser;
    // 用户服务类对象，用于调用与用户相关的业务逻辑，比如验证密码、更新密码等操作
    private UserService userService;
    // 用于输入原密码的密码框
    private JPasswordField oldPasswordField;
    // 用于输入新密码的密码框
    private JPasswordField newPasswordField;
    // 用于再次输入新密码（用于确认）的密码框
    private JPasswordField confirmPasswordField;

    // 构造函数，接收一个User对象，用于初始化当前要修改密码的用户，并进行界面组件的初始化
    public ChangePasswordPanel(User user) {
        this.currentUser = user;
        this.userService = new UserService();
        initComponents();
    }

    // 初始化界面组件的方法，负责构建整个修改密码面板的布局和添加各种组件
    private void initComponents() {
        // 设置该面板的布局为BorderLayout，方便划分不同区域放置组件
        setLayout(new BorderLayout());

        // 创建标题面板，用于放置显示标题的标签，采用FlowLayout布局且居中显示
        JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JLabel titleLabel = new JLabel("修改密码");
        // 设置标题字体为微软雅黑、加粗、字号为24
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
        titlePanel.add(titleLabel);
        // 将标题面板添加到当前面板的北部（上方）区域
        add(titlePanel, BorderLayout.NORTH);

        // 创建表单面板，采用GridBagLayout布局，用于放置各种密码输入相关的标签和文本框等组件
        JPanel formPanel = new JPanel(new GridBagLayout());
        // 设置表单面板的边框，使其四周有一定的空白间距
        formPanel.setBorder(BorderFactory.createEmptyBorder(20, 50, 20, 50));
        GridBagConstraints gbc = new GridBagConstraints();
        // 设置组件之间的间距
        gbc.insets = new Insets(5, 5, 5, 5);
        // 设置组件在网格布局中的对齐方式为靠西（左对齐）
        gbc.anchor = GridBagConstraints.WEST;

        // 原密码相关组件添加
        // 设置组件在网格中的横坐标位置为0
        gbc.gridx = 0;
        // 设置组件在网格中的纵坐标位置为0
        gbc.gridy = 0;
        formPanel.add(new JLabel("原密码："), gbc);

        gbc.gridx = 1;
        oldPasswordField = new JPasswordField(20);
        formPanel.add(oldPasswordField, gbc);

        // 新密码相关组件添加
        gbc.gridx = 0;
        gbc.gridy = 1;
        formPanel.add(new JLabel("新密码："), gbc);

        gbc.gridx = 1;
        newPasswordField = new JPasswordField(20);
        formPanel.add(newPasswordField, gbc);

        // 确认新密码相关组件添加
        gbc.gridx = 0;
        gbc.gridy = 2;
        formPanel.add(new JLabel("确认新密码："), gbc);

        gbc.gridx = 1;
        confirmPasswordField = new JPasswordField(20);
        formPanel.add(confirmPasswordField, gbc);

        // 按钮面板相关设置及组件添加
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.CENTER;
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JButton submitButton = new JButton("确认修改");
        // 为确认修改按钮添加事件监听器，当按钮被点击时调用changePassword方法处理密码修改逻辑
        submitButton.addActionListener(this::changePassword);
        buttonPanel.add(submitButton);
        formPanel.add(buttonPanel, gbc);

        // 将表单面板添加到当前面板的中部（中间）区域
        add(formPanel, BorderLayout.CENTER);
    }

    // 处理密码修改的方法，当点击确认修改按钮时触发该方法执行相关逻辑
    private void changePassword(ActionEvent e) {
        // 获取用户在原密码框中输入的密码内容，并转换为字符串类型
        String oldPassword = new String(oldPasswordField.getPassword());
        // 获取用户在新密码框中输入的密码内容，并转换为字符串类型
        String newPassword = new String(newPasswordField.getPassword());
        // 获取用户在确认新密码框中输入的密码内容，并转换为字符串类型
        String confirmPassword = new String(confirmPasswordField.getPassword());

        // 验证输入合法性，若有密码字段为空，则弹出提示框告知用户并结束该方法执行
        if (oldPassword.isEmpty() || newPassword.isEmpty() || confirmPassword.isEmpty()) {
            JOptionPane.showMessageDialog(this, "请填写所有密码字段！", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 验证两次输入的新密码是否一致，若不一致则弹出提示框告知用户并结束该方法执行
        if (!newPassword.equals(confirmPassword)) {
            JOptionPane.showMessageDialog(this, "两次输入的新密码不一致！", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 调用userService的verifyPassword方法验证原密码是否正确，根据用户名和输入的原密码进行验证
        if (userService.verifyPassword(currentUser.getUsername(), oldPassword)) {
            // 若原密码正确，调用userService的updatePassword方法尝试更新密码，根据用户ID和新密码进行更新
            if (userService.updatePassword(currentUser.getId(), newPassword)) {
                // 若密码更新成功，弹出提示框告知用户密码修改成功
                JOptionPane.showMessageDialog(this, "密码修改成功！");
                // 清空原密码输入框内容
                oldPasswordField.setText("");
                // 清空新密码输入框内容
                newPasswordField.setText("");
                // 清空确认新密码输入框内容
                confirmPasswordField.setText("");
            } else {
                // 若密码更新失败，弹出提示框告知用户密码修改失败
                JOptionPane.showMessageDialog(this, "密码修改失败！", "错误", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            // 若原密码错误，弹出提示框告知用户原密码错误
            JOptionPane.showMessageDialog(this, "原密码错误！", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }
}